package com.zhuiwei.initialization;

import static net.mindview.util.Print.*;

/**
 * 显示的静态初始化
 * @author zhuiwei
 * @see《java编程思想 第四版》5.7.3
 */
class Cup {
  Cup(int marker) {
    print("Cup(" + marker + ")");
  }
  void f(int marker) {
    print("f(" + marker + ")");
  }
}

class Cups {
  static Cup cup1;
  static Cup cup2;
  static {
    cup1 = new Cup(1);
    cup2 = new Cup(2);
  }
  Cups() {
    print("Cups()");
  }
}

public class ExplicitStatic {
  public static void main(String[] args) {
    print("Inside main()");
    Cups.cup1.f(99);  // (1)
  }
  // static Cups cups1 = new Cups();  // (2)
  // static Cups cups2 = new Cups();  // (2)
}

/*
输出结果:
Inside main()
Cup(1)
Cup(2)
f(99)
*/
/**
 * 说明：
 * 首次生成这个类对象时，或首次访问属于那个类的静态数据成员，执行static关键字后面的代码
 * 本例子：
 * 1、执行print("Inside main()");输出Inside main()
 * 2、Cups.cup1  首次访问类的静态数据成员。先执行static关键字后面的代码，输出Cup(1) Cup(2)
 * 3、Cups.cup1.f(99); 输出 f(99)
 */
